在最新版的ML-Agents Toolkit(v0.14)中,我们添加了新的自对弈(self-play)功能,用于训练对抗类游戏中的代理机器人(比如零和博弈中,一方的所得即是另一方所失)。在本博文中,我们将大概介绍自对弈功能,通过示例中的Soccer足球Demo,其功能带来的稳定且高效的训练。
在ML-Agents Toolkit的Tennis网球和Soccer足球Demo中,两队代理机器人将互相竞争。此类对抗情景下的代理机器人训练在过去是比较困难的。在早前的ML-Agents Toolkit中,此种训练只有依靠精妙的奖励机制才能实现。在0.14版中,用户们可以使用强化学习中的自对弈功能来训练代理机器人,强化学习机制已经促生了许多优秀的人工智能,比如OpenAI Five和DeepMind的AlphaStar。自对弈功能会将代理机器人当前和过去的“自我”当作对手,利用传统的RL算法逐渐地提高自身和对手水平。训练良好的代理机器人甚至可以用于对抗高水平的人类玩家。
自对弈所提供的学习环境与真人对抗非常相似。一名人类运动员在学习网球时,会找到水平近似的对手一同训练,因为对手如果太强或太弱并不有助于提高技术。为了更好地提高水平,网球初学者的对手应该也是初学者,而不是球都拿不起的小朋友或者是世界冠军德约科维奇,这样的训练才更有价值。前者无法把球打回,后者无法打出容易打回的球。在初学者有了足够的击球力量后,就可以与水平更强一点的对手竞技了,这是一个循序渐进的过程。
在本文中,我们将从技术层面介绍自对弈的运作方式,同时大致介绍Tennis网球和Soccer足球Demo自对弈的表现。
在构建人工代理机器人方面,自对弈概念已经有段历史了。首个使用自对弈机制的例子是Arthur Samuel的西洋跳棋下棋系统,系统开发于50年代,于1959年发布。它作为RL领域的先驱,促生了Gerald Tesauro发布于1995年的重大成果:TD-Gammon。TD-Gammon使用了时序差分算法TD(λ)和自对弈训练了一个双陆棋代理机器人,其水准接近人类高手。有的时候TD-Gammon有比世界级选手更加出色的棋子位置理解。
自对弈在当今RL领域的许多出色成果中起着重要作用。比较著名的有Chess and Go超人类代理机器人,DOTA 2精英代理机器人,在OpenAI开发的摔跤和捉迷藏这两个环境中也发展出了极为复杂的策略和反策略。在这些成果中,研究者指出代理机器人的策略出乎了人类的意料。游戏中的自对弈可赋予代理机器人独立于程序外的创造力。将游戏的规则和胜负条件告诉代理机器人后,它需要自行发展出竞争行为。据TD-Gammon的创造者所说,此类学习框架不受人的约束,“程序不会受到人类错误、不可靠的偏见或成见的影响。”此种自由让代理机器人发展出了巧妙的战术,甚至改变了人类对部分游戏的看法。在传统的RL中,代理机器人会尝试习得最大化奖励的行为策略。奖励信号组成了代理机器人的任务,比如达成特定状态或收集物品。代理的行为则受到环境的限制,比如重力、路上的障碍,以及代理自身行动产生的影响,像为自己施加移动的外力,这些都属于环境限制,会限定代理的有效行为。而为了取得更高的奖励,代理必须学会应对这些环境中的外力。就是说,代理必须与环境中的种种约束不断抗争,以达成奖励最大的状态序列。
左侧为常见的RL情景:代理在环境中行动后到达下一个状态,取得一定奖励;右侧为对抗游戏中学习情景,代理会与对手对抗,而在其眼中,对手也算作环境的一部分。在对抗性游戏中,代理机器人不仅与环境动态抗争,还会与另一个(智能)代理抗争。我们可以将对手看作嵌入环境的一部分,它的动作会直接影响到代理机器人观察到的状态、以及收到的奖励。ML-Agents Toolkit中的Tennis网球示例环境
来看看ML-Agents的Tennis网球演示。蓝色球拍(左)是正在学习的代理,而紫色球拍(右)则是对手。为了将球打过球网,代理机器人必须计算球过来的轨迹,调整挥拍的角度和速度,来对抗重力(环境因素之一)。然而,将球打过球网只是整个过程的一半。当对手水平较高时,它可能会打出致胜一球;而当对手较弱时,它打出的球可能触网。只有当对手水平相当时,它才能打回这球,让游戏继续下去。所以,状态和奖励是由环境和对手共同决定的。然而,在以上三种情况中,代理机器人打的球都是相同的,使得对抗游戏中的学习和代理机器人的训练实现起来并没那么简单。找到合适的对手对学习的影响并不小。在前边的讨论中我们已经提到,游戏中对手的水平对结果有着显著影响。如果对手太强,代理机器人要从零学起会非常困难;另一方面,如果对手太弱,代理机器人虽然能取胜,但习得的行为在对抗别的或更强的对手时并不会有作用。因此,我们的对手水平需要与代理机器人相近(稍微强那么一点点)。此外,代理会一直提升自己,对手也需要有相应的提升。
自对弈这时就有用了。代理机器人自身就满足了作为对手的要求。水平(与自己相比)近似,也会随时间提升。这时,嵌入到环境中的正是代理自己的对策。如果你熟知课程学习(curriculum learning),可以将整个过程看作代理机器人对抗逐渐增强的对手,从而形成一种自然进化般的课程学习(也称auto-curricula, 自动化课程学习)。因此,我们可以将自对弈套用进特定环境中,训练对抗性游戏中的代理机器人。
在下方两个部分中,我们将讨论竞技性代理机器人训练中的技术问题,以及围绕ML-Agents Toolkit中自对弈功能使用和应用上的细节。以下两部分与文章主旨的关联并不大。我们在自对弈框架中遇到了一些实践上的问题。具体来说有两个问题,一是在对抗特定打法时出现的过拟合现象,二是由于自对弈的对手不断变化导致的训练环境不断变化造成的问题。前者之所以是问题,是因为我们希望代理机器人能应付各种情况,在对抗不同对手时具有一定的适应性(而不是只对某一种打发有应对措施)。而后者之所以是问题,可以用以下的例子来说明。在Tennis网球环境中,不同的对手打回球的角度和速度是不同的。从代理机器人的角度来说,意味着同样的对策随着训练推进会导致不同的状态。由于传统的RL算法假设环境是固定的,因此如果随着对手的改变环境变化的话,就会出现问题。总之,这两个问题交织在一起,如果我们要解决前一个问题,让代理可以应付各种不同的对手,则环境的不稳定导致的传统RL算法失灵的问题就会更严重。
为了解决这个两难境地,我们使用了一个缓冲器来储存代理过去的对策,然后从这些过去的对策中采样来构成对手,再让代理机器人与其对抗更长的时间。而在过去的对策中采样后,对手的打法也会变得多样。此外,增加代理与某一固定对手的训练时间可以让环境的变化不要那么大,从而让训练更加稳定,提高学习环境的一致性。不仅如此,这些算法部分还能用超参数(hyperparameter)来控制,详细的将在下方讨论。
在设定自对弈的超参数时,主要考虑的是最终对策中技巧与泛用性的取舍,以及学习过程的稳定性。与快速改变、风格多样的对手训练会增加不稳定性,而与缓慢变化或根本不变的对手训练会让学习过程更加稳定。而目前的超参数可以控制代理机器人当前有多少对策将被用在之后的对手身上,以及新对抗中的采样次数、对手身上的采样次数,以及当前代理机器人对抗数据池中特定对手的概率。若想了解当前可用的自对弈超参数,请参阅ML-Agent Github代码库中的自对弈说明文件。
https://github.com/Unity-Technologies/ml-agents/blob/latest_release/docs/Training-Self-Play.md在对抗性游戏中,累积的环境奖励可能不是跟踪学习进度的有效尺度。这是因为累积奖励的多少完全取决于对手的水平。在一定水平下,代理机器人在面对更弱或更强的对手时分别会获取更多或更少的奖励。为此,我们使用了ELO定级系统,该系统经常被用于计算在零和博弈中双方相对水平。在训练中,代理的等级数值应该会稳定地增长。你可以使用TensorBoard和像累积奖励这样的测量标尺来追踪代理机器人的水平。
在原先的版本中,因为Soccer足球示例环境中的训练并不稳定,我们并没有添加进代理机器人的策略。不过,在有了自对弈、重构了一些代码后,我们现在可以训练出一些关键的行为了。这其中最重大的改变是我们将“玩家位置”从代理机器人身上移除了。此前,我们本着让游戏更符合常理的考虑,将代理机器人分为了守门员和前锋。而在下方的视频中,我们注意到在新环境下,代理之间出现了角色分明的合作性行为,其表现与有守门员和前锋时非常相似。这就是说,代理机器人们自己学会了分工合作!在所有代理身上,我们设定进球得一分,输球扣一分,此外每秒都会扣除0.0003分作为惩罚,以鼓励代理机器人进攻。
需要强调的是,Soccer足球环境中代理机器人身上出现的合作行为并没有多代理算法的支持,我们也并未指定角色。这个结果表明,只要将问题合理地阐述给算法,便能用简单的算法训练出复杂的行为,关键在于代理机器人可以观察到队友,即能接收队友的相对位置作为观测数据。在做出进攻性行为时,代理机器人会与队友沟通,让它退回防守。或者,代理后退防守时,便会让队友向前进攻。上方的视频中,代理机器人接收到队友的暗示,还各自扮演了进攻和防守位置。自对弈功能可以在游戏中训练出新颖、有趣的对抗行为。如果你有在使用该功能,欢迎与我们分享成果!如果你使用了本版本中的功能,可以向我们反馈。如果你有ML-Agents Toolkit相关的任何反馈,可以填写这份调查问卷:
https://docs.google.com/forms/d/e/1FAIpQLSfVnER5i5YiE748MjyI7Ts3gIgpfzXZjSrDGPKR7s2Ydeb9tg/viewform也可以直接发邮件给我们。如果遇到任何Bug,请在ML-Agents的GitHub问题反馈页面联系我们。https://github.com/Unity-Technologies/ml-agents/issues如果有其他问题,请在Unity ML-Agents论坛与我们联系。https://forum.unity.com/forums/ml-agents.453/此外,我们在Unity Connect上开辟的“Unity机器学习小组”,已经超过1500位开发者参与其中,包括Unity ML Team的工程师、了解ML-Agents的Unity技术专家在内的许多大牛都在小组中,积极向大家回答问题。内容方面还附上了最新的Unity ML-Agents 0.14.1环境搭建指南,之后还会有更多精彩技术与案例资料上传到小组内。欢迎各位对于机器学习有兴趣的Unity开发者,或者是对于Unity感兴趣的机器学习研究者,扫一扫下面的二维码,加入小组,参与讨论。